// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "UShaderBook/C5/SimpleShader"
// 在Unity GUI 的材质中选择shader时的路径以及名称，与shader文件名无关
{
    Properties{
        _Color ("Color Tint", Color) = (1.0, 1.0, 1.0, 1.0)
    }

    SubShader
    {
        Pass{
            CGPROGRAM // CG 代码段的开始
            #pragma vertex vert 
            #pragma fragment frag
            // 两个编译指令告诉Unity哪个函数代表顶点着色器，哪个函数代表片元着色器
            fixed4 _Color;
            struct a2v
            {
                float4 vertex : POSITION; // POSITION指定想要输入什么数据，
                float3 normal : NORMAL; // 法线
                float4 texcoord : TEXCOORD0; // 材质坐标
            }; // 定义结构体来获取数据

            struct v2f
            {
                float4 pos : SV_POSITION;
                fixed3 color : COLOR0;
            };

            v2f vert(a2v v) // 顶点着色器代码，逐顶点执行
            { // 参数使用:函数后的:SV_POSITION表示函数的输出
              // POSITION 是模型空间的顶点坐标，在这里我们将模型空间的坐标转化为裁剪空间坐标，并输出裁剪空间中的顶点坐标
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.color = v.normal * 0.5 + fixed3(0.5, 0.5, 0.5);                
                return o;
                // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
            }


            float4 frag(v2f i) : SV_TARGET // 逐片元调用，输入实际上是插值之后的结果
            {
                fixed3 c = i.color;
                c *= _Color.rgb; // 提取RGB分量
                return fixed4(c, 1.0); // 返回低精度浮点作为颜色（白色）
            }
            ENDCG // CG 代码段的结束
        }
    }
}
